Abstract
A web 3D multi-paradigm and multi-scalar presentation of lithic tools and ancient iconography (rock-art, hieroglyphs). 3D data management with open-source softwares (GitHub, 3DHOP, Blender, R, JavaScript, etc.) within the frame of Linked-Open data (LOD)Ce document Rmarkdown (R + Markdown) alterne modèles 3D, cartes, liens, tableaux, etc. avec des “morceaux de code” informatique (i.e. code chunks, en fond grisé). Les données qui ont servi sont enregistrées dans deux repository GitHub: zoometh/3DHOP qui est un fork de 3DHOP (3D Heritage Online Presenter), et où sont entreposés les données 3D, et zoometh/rockart pour le reste des données.
La tracéologie est l’étude de traces souvent microscopiques sur des objets ayant des dimensions allant de quelques centimètres à plusieurs mètres. Une intégration 3D de ces différentes échelles peut permettre une meilleure compréhension des savoirs-faires (technologie, archéologie du geste, etc.) et une meilleure diffusion de ces connaissances dans la communauté scientifique et auprès du grand public via le web 3D.
Sur chaque acquisition 3D, le dessin d’une zone d’intérêt permet de localiser les traces d’utilisation et de lier ce modèle 3D avec un autre modèle 3D obtenu à une échelle inférieure. Dans cet exemple, nous travaillons à l’intégration de modèles 3D issus de trois échelles différentes.
Le dessin des zone d’intérêt (Region of Interest, ou ROI) est une surface 3D dessinée directement sur l’objet depuis un logiciel d’édition 3D (e.g. Blender).
Dessin de la ROI (en vert) comme surface 3D sur le modèle 3D (en gris) dans le logiciel Blender
L’objet (échelle supérieure) et la surface 3D (échelle inférieure) sont enregistrés au format .ply. L’objet est transformé en .nxz, un format adapté pour le streaming 3D, avec l’application Nexus. Ces modèles, sont ensuite intégrés dans le framework 3DHOP et stockés dans le fork du dépôt GitHub zoometh/3DHOP.
Schéma de travail pour l’exposition d’un modèle 3D sur le web
Ci-dessous nous présentons une capture d’écran d’un modèle 3D d’un outil expérimental avec la ROI (à gauche en bleu, peu visible) localisant (grossièrement) les traces d’utilisation. Cette ROI est activable ou desactivable avec le boution 3DHOP . Quand la ROI est clickée, elle peut ouvrir une nouvelle page HTML avec le modèle 3D à l’échelle inférieure
Modèle 3D intégré dans le framework 3DHOP
Ce modèle peut être consulté à cette URL:
| echelle | mesures | instrument |
|---|---|---|
| macro | cm | Laser |
| meso | mm | HIROX |
| micro | \(\mu\)m | ConFocal |
Acquisition de l’objet avec un laser, ou en photogrammétrie
Acquisition avec le Laser de lumière structurée smart SCAN 3D Breuckman (IMF-CSIC)
HIROX
ConFocal
Nous présentons ci-dessous, un essai de FAIRisation des données liées aux graphies anciennes (art rupestre, hiéroglyphes) en nous focalisant sur la cartogaphie et la 3D. Ici, nous prenons ces deux (2) sites en exemple:
Pour chacun de ces sites, le logo signale l’existence d’un modèle 3D
La région du mont Bégo (Alpes-Maritimes, France) est surtout connue pour son art rupestre avec un nombre impressionnant de roches gravées, mais le site est aussi l’un des premiers de montagne à être occupé au début du Néolithique (ca. -5300 BC)
Actuellement, les données sont stockées dans une base de données Postgres 13 locale. Ici, nous sélectionnons quelques champs - y compris les coordonnées géographiques - et les exportons dans un fichier .csv stocké dans le dépôt GitHub.
drv <- dbDriver("PostgreSQL")
con <- dbConnect(RPostgres::Postgres(),
dbname = "bego_20_04_2021",
host="localhost",
port=5433,
user="postgres",
password="postgres")
sqll <- "SELECT idroche, nom, x, y, z FROM roches_spat"
roches.all <- dbGetQuery(con,sqll)
roches.all$idroche <- gsub("\\.", "\\_", roches.all$idroche )
write.csv(roches.all, "data/roches_all.csv", row.names = F)
dbDisconnect(con)
Certaines roches gravées ont été modélisées en 3D par photogrammétrie (logiciel commercial Metashape Photoscan) au format 3D (.obj ou .ply). Une application commerciale comme Sketchfab permet de mettre un modèle 3D en ligne et d’intégrer un conteneur <iframe> vers ce modèle. Comme ici:
Dans le domaine du libre, ces modèles une fois transformés sont manipulés avec le framework 3DHOP et stockés dans le fork du dépôt GitHub zoometh/3DHOP. Dans le code chunk ci-dessous, nous lisons le contenu du dossier ‘minimal’ pour obtenir les noms de ces modèles (stockés en tant que fichiers .nxz dans le dossier ‘models’).
roches.all <- read.csv("data/roches_all.csv")
req <- GET(url.html)
stop_for_status(req)
filelist <- unlist(lapply(content(req)$tree, "[", "path"), use.names = F)
D3.models <- grep("minimal/.*html$", filelist, value = TRUE)
D3.models <- gsub("minimal/", "", D3.models)
D3.models <- sort(gsub(".html$", "", D3.models))
nm.models <- roches.all[roches.all$idroche %in% D3.models, "nom"]
l.nm.models <- paste0(paste0("*", nm.models, "* (", D3.models,")"))
nb.models <- length(D3.models)
Actuellement, il existe 7 modèles 3D: Looped Skin Rock (17_2_59@c), Roche de l’archer (18_1_28@a), Roche de l’anthropomorphe aux bras en zigzag (4_3_16D), Stèle du Chef de Tribu (7_1_8), Roche du Sorcier (8_2_34), Looped Skin Rock (KIU2610), Roche de l’archer (lithic_tool)
Nous lions les URL des roches gravées modélisées en 3D par jointure sur leur identifiant (e.g., 7_1_8) dans la table des roches – pour les ouvrir directement à partir de la carte Leaflet –, et nous attribuons à ces roches une icône personnalisée (icône ‘3DHOP’)
roches.3D <- roches.all[roches.all$idroche %in% D3.models, ]
roches.others <- roches.all[!(roches.all$idroche %in% D3.models), ]
roches.3D.icons <- icons(
iconUrl = url.icon,
iconWidth = 40, iconHeight = 56,
iconAnchorX = 20, iconAnchorY = 28
)
roches.3D$desc <- paste0("roche: ", roches.3D$idroche, '<br> 3D model: <a href=',
shQuote(paste0(url.3dhop, roches.3D$idroche, ".html")),
"\ target=\"_blank\"",">", roches.3D$nom, "</a>")
roches.others$desc <- paste0("roche: ", roches.others$idroche)
leaflet(width = "700px", height = "700px") %>%
addTiles(group = 'OSM') %>%
addProviderTiles("Esri.WorldImagery", group = "Ortho") %>%
addCircleMarkers(data = roches.others,
lng = ~x,
lat = ~y,
popup = ~desc,
color = "red",
radius = 0.5,
opacity = 0.8) %>%
addMarkers(data = roches.3D,
lng = ~x,
lat = ~y,
popup = ~desc,
icon = roches.3D.icons) %>%
addLayersControl(
baseGroups = c('Ortho', 'OSM')) %>%
addScaleBar(position = "bottomleft")
Certains de ces modèles 3D ont des annotations, comme la Roche de l’homme aux bras en zigzag, ou la Stèle du Chef de Tribu
En Haute-Egypte, le complexe cultuel de Karnak (temples, pylos, chapelles, etc.) se développe au cours du Nouvel Empire, corrélativement au culte d’Amon. Le site est étudié depuis près de 150 ans par une équipe d’égyptologues français. La documentation de ces monuments en 3D, et l’interopérabilité de ces modèles 3D, peut permettre de mieux comprendre l’évolution des hiéroglyphes dans le temps (paléographie)
Le jeu de données correspond à un fichier .csv (locus.csv) conservé sur GitHub
locus <- read.csv("www/locus.csv", sep = ";", row.names = NULL)
kable(locus, "html", escape = FALSE,
caption = "Données Karnak") %>%
kable_styling(bootstrap_options = c("hover", "condensed"), font_size=12)
| KIU | nom | couleur | D3 | X | Y | credit3D |
|---|---|---|---|---|---|---|
| 1027 | Chapelle de Sésostris Ier | white | NA | 32.65720 | 25.72034 | |
| 1192 | Chapelle d’Hatshepsut | red | NA | 32.65768 | 25.72043 | |
| 2610 | Chapelle de Philippe Arrhidée | green | KIU2610 | 32.65867 | 25.71810 | SirCharlesWilson - Sketchfab |
Les liens entre ces données et leurs identifiants KIU (Karnak Identifiant Unique) – qui sont égalment des URL– sont générés par concatenation
url.sith <- "http://sith.huma-num.fr/karnak/"
locus$url <- paste0('<a href=', shQuote(paste0(url.sith, locus$KIU)),
"\ target=\"_blank\"",">", paste0("KIU",locus$KIU), "</a>")
Le (très beau) modèle 3D de KIU2610, nous est fourni par Sketchfab
Ce modèle est ouvert dans Blender et une nouvelle géométrie (un mesh) sur une partie de sa surface pour signaler un panneau (KIU2613). Ce panneau est donc un sous-ensemble de KIU2160
Ces données sont comparées avec les modèles 3D existant dans le repository GitHub zoometh/3DHOP
req <- GET(url.html)
stop_for_status(req)
filelist <- unlist(lapply(content(req)$tree, "[", "path"), use.names = F)
D3.models <- grep("minimal/.*html$", filelist, value = TRUE)
D3.models <- gsub("minimal/", "", D3.models)
D3.models <- sort(gsub(".html$", "", D3.models))
nm.models <- locus[locus$url %in% D3.models, "D3"]
nb.models <- length(nrow(nm.models))
monum.3D <- locus[locus$D3 %in% D3.models, ]
monum.others <- locus[!(locus$D3 %in% D3.models), ]
monum.3D.icons <- icons(
iconUrl = url.icon,
iconWidth = 40, iconHeight = 56,
iconAnchorX = 0, iconAnchorY = 0
)
monum.3D$desc <- paste0(monum.3D$url, " : ", monum.3D$nom, '<br><a href=',
shQuote(paste0(url.3dhop, monum.3D$D3, ".html")),
"\ target=\"_blank\"",">","<b> modèle 3D </b>", "</a>")
monum.others$desc <- paste0(monum.others$url, " : ", monum.others$nom)
leaflet(width = "700px", height = "700px") %>%
addTiles(group = 'OSM') %>%
addProviderTiles("Esri.WorldImagery", group = "Ortho") %>%
addCircleMarkers(data = monum.others,
lng = ~X,
lat = ~Y,
popup = ~desc,
color = ~couleur,
radius = 15,
opacity = .5) %>%
addMarkers(data = monum.3D,
lng = ~X,
lat = ~Y,
popup = ~desc,
icon = monum.3D.icons) %>%
addLayersControl(
baseGroups = c('Ortho', 'OSM')) %>%
addScaleBar(position = "bottomleft")